name: linux-exfat-oot CI

on:
  push:
    branches: [ "for-kernel-version-from-4.1.0" ]
  pull_request:
    branches: [ "for-kernel-version-from-4.1.0" ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Download the kernel
      run: |
        sudo apt-get update
        sudo apt-get install libelf-dev wget tar gzip python2.7
        wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.1.36.tar.gz
        tar xf linux-4.1.36.tar.gz
        mv linux-4.1.36 linux-stable
        rm -rf linux-4.1.36.tar.gz
    - name: Prerequisite for xfstests testing
      run: |
        sudo apt-get install linux-headers-$(uname -r)
        sudo apt-get install autoconf libtool pkg-config libnl-3-dev libnl-genl-3-dev
        sudo apt-get install xfslibs-dev uuid-dev libtool-bin xfsprogs libgdbm-dev gawk fio attr libattr1-dev libacl1-dev libaio-dev
        git clone --branch=exfat-next https://github.com/exfat-utils/exfat-utils
        git clone https://github.com/namjaejeon/exfat-testsuites
        export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
        export PATH=/usr/local/lib:$PATH
        sudo useradd fsgqa
        sudo useradd 123456-fsgqa
    - name: Copy exfat source to kernel
      run: |
        mv linux-stable ../
        mkdir ../linux-stable/fs/exfat
        cp -ar * ../linux-stable/fs/exfat/
    - name: Compile with 4.1 kernel
      run: |
        cd ../linux-stable
        yes "" | make oldconfig > /dev/null
        echo 'obj-$(CONFIG_EXFAT_FS) += exfat/' >> fs/Makefile
        echo 'source "fs/exfat/Kconfig"' >> fs/Kconfig
        echo 'CONFIG_EXFAT_FS=m' >> .config
        echo 'CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8"' >> .config
        make -j$((`nproc`+1)) fs/exfat/exfat.ko
    - name: Run xfstests testsuite
      run: |
        cd ..
        rm -rf linux-stable
        cd linux-exfat-oot
        make > /dev/null
        sudo make install > /dev/null
        sudo insmod exfat.ko
        cd exfat-utils
        ./autogen.sh > /dev/null
        ./configure > /dev/null
        make -j$((`nproc`+1)) > /dev/null
        sudo make install > /dev/null
        cd ..
        sudo mkdir -p /mnt/scratch
        sudo mkdir -p /mnt/test
        sudo mkdir -p full_test
    - name: create file/director test
      run: |
        truncate -s 10G full_test.img
        sudo losetup /dev/loop22 full_test.img
        sudo mkfs.exfat /dev/loop22
        sudo mount -t exfat /dev/loop22 ./full_test/
        cd full_test/
        i=1;while [ $i -le 10000 ];do sudo touch file$i;if [ $? != 0 ]; then exit 1; fi; i=$(($i + 1));done
        sync
        sudo fsck.exfat /dev/loop22
        sudo rm -rf *
        i=1;while [ $i -le 10000 ];do sudo mkdir file$i;if [ $? != 0 ]; then exit 1; fi; i=$(($i + 1));done
        sync
        sudo rm -rf *
        sudo fsck.exfat /dev/loop22
        cd ..
        sudo umount ./full_test/
        sudo fsck.exfat /dev/loop22
        sudo losetup -d /dev/loop22
        rm full_test.img
    - name: xfstest tests
      run: |
        cd exfat-testsuites/
        tar xzvf xfstests-exfat.tgz > /dev/null
        cd xfstests-exfat
        make -j$((`nproc`+1)) > /dev/null
        truncate -s 100G test.img
        truncate -s 100G scratch.img
        sudo losetup /dev/loop20 test.img
        sudo losetup /dev/loop21 scratch.img
        sudo mkfs.exfat /dev/loop20
        sudo mkfs.exfat /dev/loop21
        sudo ./check generic/001
        sudo ./check generic/006
        sudo ./check generic/007
        sudo ./check generic/011
        sudo ./check generic/013
        sudo ./check generic/014
        sudo ./check generic/028
        sudo ./check generic/029
        sudo ./check generic/030
        sudo ./check generic/034
        sudo ./check generic/035
        sudo ./check generic/036
        sudo ./check generic/069
        sudo ./check generic/073
        sudo ./check generic/074
        sudo ./check generic/075
        sudo ./check generic/076
        sudo ./check generic/080
        sudo ./check generic/084
        sudo ./check generic/091
        sudo ./check generic/095
        sudo ./check generic/098
        sudo ./check generic/100
        sudo ./check generic/112
        sudo ./check generic/113
        sudo ./check generic/114
        sudo ./check generic/120
        sudo ./check generic/123
        sudo ./check generic/124
        sudo ./check generic/127
        sudo ./check generic/129
        sudo ./check generic/130
        sudo ./check generic/131
        sudo ./check generic/132
        sudo ./check generic/133
        sudo ./check generic/135
        sudo ./check generic/141
        sudo ./check generic/169
        sudo ./check generic/198
        sudo ./check generic/207
        sudo ./check generic/208
        sudo ./check generic/209
        sudo ./check generic/210
        sudo ./check generic/211
        sudo ./check generic/212
        sudo ./check generic/215
        sudo losetup -d /dev/loop20
        sudo losetup -d /dev/loop21
        rm test.img
        rm scratch.img
        truncate -s 100G test.img
        truncate -s 100G scratch.img
        sudo losetup /dev/loop20 test.img
        sudo losetup /dev/loop21 scratch.img
        sudo mkfs.exfat /dev/loop20
        sudo mkfs.exfat /dev/loop21
        sudo ./check generic/221
        sudo ./check generic/239
        sudo ./check generic/240
        sudo ./check generic/241
        sudo ./check generic/245
        sudo ./check generic/246
        sudo ./check generic/247
        sudo ./check generic/248
        sudo ./check generic/249
        sudo ./check generic/257
        sudo ./check generic/260
        sudo ./check generic/263
        sudo ./check generic/285
        sudo ./check generic/288
        sudo ./check generic/308
        sudo ./check generic/309
        sudo ./check generic/310
        sudo ./check generic/313
        sudo ./check generic/323
        sudo ./check generic/325
        sudo ./check generic/338
        sudo ./check generic/339
        sudo ./check generic/340
        sudo ./check generic/344
        sudo ./check generic/345
        sudo ./check generic/346
        sudo ./check generic/354
        sudo ./check generic/376
        sudo ./check generic/393
        sudo ./check generic/394
        sudo ./check generic/405
        sudo ./check generic/406
        sudo ./check generic/409
        sudo ./check generic/410
        sudo ./check generic/411
        sudo ./check generic/412
        sudo ./check generic/418
        sudo ./check generic/428
        sudo ./check generic/437
        sudo ./check generic/438
        sudo ./check generic/441
        sudo ./check generic/443
        sudo ./check generic/448
        sudo ./check generic/450
        sudo ./check generic/451
        sudo ./check generic/452
